package org.hhh.basic.service.impl;

import org.hhh.basic.constant.BaseConstants;
import org.hhh.basic.exception.BusinessException;
import org.hhh.basic.util.StrUtils;
import org.hhh.user.domain.User;
import org.hhh.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.hhh.basic.service.IVerifyCodeService;

import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public void sendSmsCode( Map<String,String> params) {
        String phone = params.get("phone");
        String type = params.get("type");
//        1.校验
//        1.1 手机号不能为空 phone
        if (StringUtils.isEmpty(phone)||StringUtils.isEmpty(type)) {
            throw new BusinessException("手机号不能为空！！！");
        }
        String phonekey="";
        if("register".equals(type)){//手机验证码注册
            //        1.2 手机号不能被注册, 报错 查询 t_user
            User user=userMapper.loadByPhone(phone);
            if (user != null) {
                throw new BusinessException("手机号码已经存在了，不能使用此手机号注册了");
            }
            phonekey=BaseConstants.BUSINESS_REGISTER_PREFIX+phone;
        }else if ("binder".equals(type)){//手机号绑定微信
            phonekey=BaseConstants.BUSINESS_BINDER_PREFIX+phone;
        }
        sendCode(phonekey);

    }

    /**
     * 发送验证码流程
     * @param phonekey
     */
    public void sendCode(String phonekey){
        //        2.查看验证码是否有效   是否过了3分钟  key business_register:159
        String key=phonekey;
        Object cvt = redisTemplate.opsForValue().get(key);//获取value值
//        2.1 如果没有过期    value 9527:1346489765465
        String code= "";
        if (cvt!=null){
            Long oldTime = Long.valueOf(((String)cvt).split(":")[1]);//1346489765465
//        2.1.1 判断是否过了1分钟重发时间 1 *60 * 1000
            if (System.currentTimeMillis()-oldTime<=1*60*1000){
//              2.1.1.1 如果没过, 使劲骂....
                throw new BusinessException("小伙子不要搞事情,放弃吧");
            }
//        2.1.1.2 如果过了 (过了1分钟,还没到3分钟,使用还没过期的验证码)=== code  9527
            code = ((String)cvt).split(":")[0];//使用原来上一次的
        }else {
//        2.2 如果过期了(或者是第一次来)
//        2.2.1 直接生成新的验证码   ===  code
            code = StrUtils.getComplexRandomString(4);//新的验证码
        }
//        3.保存验证码到redis 直接设置3分钟过期就ok了
//        key   business_register:159
//        value 9527:1346489765465
        String codeValue=code+":"+System.currentTimeMillis();
        redisTemplate.opsForValue().set(key, codeValue, 3, TimeUnit.MINUTES);//分钟
//        4.调用SmsUtils发送短信给客人
        System.out.println("你的验证码是:"+code+"请你在3分钟内使用！！");

    }
}
